// 此处封装主要是 实现请求拦截，实现响应拦截，常见错误信息处理，请求头设置

import axios, { type AxiosInstance, type AxiosRequestConfig, type AxiosResponse, type AxiosError  } from "axios"
import config from '@/config'
import { handleNetworkError } from './responseHandle' // 响应拦截回调
import { message } from 'ant-design-vue'

axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

// axios 实例全局配置
export const service: AxiosInstance = axios.create({
    baseURL: import.meta.env.VITE_APP_BASE_API,
    withCredentials: true,
    timeout: 15000,
    headers: {
    }
})

// 请求拦截器
service.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // 注意：在较新版本的 axios 中，应使用 InternalAxiosRequestConfig（包含 headers 的可写类型）

    // 1. 设置通用请求头
    if (!config.headers) {
      config.headers = {};
    }
    config.headers['Content-Type'] = 'application/json';

    // 2. 添加认证 token（假设从 localStorage 或 store 获取）
    const token = localStorage.getItem('token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }

    // 3. 可选：添加时间戳防缓存（仅 GET）
    if (config.method?.toUpperCase() === 'GET') {
      config.params = {
        ...config.params,
        _t: Date.now(), // 防止缓存
      };
    }

    return config;
  },
  (error: AxiosError) => {
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use((response: AxiosResponse) => {
    // 这里会最先拿到你的response
    // 只有返回的 http 状态码是2xx，都会进来这里
    const res = response.data
    if (res.code !== 200) { // 业务状态码判断
        handleNetworkError(res.code)
        return null
    }

    return response.data
}, (error: AxiosError) => {
    // 目前发现三种情况会进入这里：
    // 1. http状态码非2开头的都会进来这里，如404,500等
    // 2. 取消请求也会进入这里，CancelToken，可以用axios.isCancel(err)来判断是取消的请求
    // 3. 请求运行有异常也会进入这里，如故意将headers写错：axios.defaults.headers = '123',或者在request中有语法或解析错误也会进入这里
    // 进入这里意味着请求失败，axios会进入catch分支
    message.error(error.message)
    return Promise.reject(error)
})
